package com.example.day0221.views
import androidx.compose.foundation.Image
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.NavigationBar
import androidx.compose.material3.NavigationBarItem
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.ui.res.painterResource
import androidx.navigation.NavDestination.Companion.hierarchy
import androidx.navigation.compose.currentBackStackEntryAsState
import androidx.navigation.compose.rememberNavController
import com.example.day0225.MyNavHost
import com.example.day0225.R
import com.example.lib_base.RoutePath

sealed class NavItem(val route: String, val title: String, val img: Int) {
    object MessagePage : NavItem(RoutePath.MESSAGE, "消息", R.drawable.message)
    object HomePage : NavItem(RoutePath.HOME, "门户", R.drawable.home)
    object MinePage : NavItem(RoutePath.MINE, "我的", R.drawable.home)
}

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun MainPage() {
    val list = listOf(NavItem.MessagePage, NavItem.HomePage, NavItem.MinePage)
    val navController = rememberNavController()

    //获取当前回退站中所有页面的状态
   //这行代码通过navController的currentBackStackEntryAsState()扩展函数获取了一个State<NavBackStackEntry?>对象，
    // 并将其赋值给stackEntryState委托属性。这个状态对象表示当前导航堆栈顶部的条目（如果存在的话），
    // 并且当堆栈条目发生变化时（例如，用户导航到新的屏幕或返回到上一个屏幕），这个状态对象也会更新。
    val stackEntryState by navController.currentBackStackEntryAsState()
    //拿到所有的导航的地址
    //从stackEntryState中提取了当前导航堆栈条目的目的地（destination）。
    // 由于stackEntryState是一个可空类型（NavBackStackEntry?），因此使用安全调用操作符?.来访问destination属性。
    // 如果stackEntryState不为null，则destination将包含当前目的地的信息；否则，destination将为null
    val destination = stackEntryState?.destination

    //脚手架,用于搭建页面的框架,它拥有头布局,脚布局,浮动按钮之类的框架内容
    Scaffold(
        bottomBar = {
            //hierarchy 通常与 any 结合使用，用于检查当前目的地或其父目的地是否满足某个条件（例如，是否匹配某个特定的路由或 ID
            //any: 是一个 Kotlin 标准库函数，用于检查序列中是否有任何一个元素满足给定的条件
            //如果你使用了嵌套导航图，可以通过 hierarchy 检查当前目的地是否在某个特定的嵌套导航图中
            if (destination?.hierarchy?.any {
                            //通过拿到底部导航的地址,对比,如果符合底部导航的地址,就展示NavigationBar,否则就不显示
                            list.map { navItem -> navItem.route }.contains(it.route)
                        } == true) {
                        //底部导航,直接创建并没有东西,需要类似menu的内容
                        NavigationBar {
                            list.forEach {
                                NavigationBarItem(selected = false, onClick = {
                                    //当点击时,跳转对应的地址
                                    navController.navigate(it.route)
                                }, icon = {
                                    //图标
                                    Image(painter = painterResource(id = it.img), contentDescription = "")
                                }, label = {
                                    //标签
                                    Text(text = it.title)
                                })
                            }
                }
            }
        }
    ) {

        MyNavHost(it = it, navHostController = navController)
    }
}